package com.study.bean;

import com.study.model.Teacher;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.Objects;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component //属性value指定bean的id，如果不指定，默认是当前类的类名，首字母小写
@Scope("singleton")
public class TeacherServiceImpl implements TeacherService {

    @Value("张三")
    private String name;
    @Value("${age}")
    private Integer age;
    /**
     * @Autowired：默认按照类型注入，默认情况下要求依赖对象必须存在，如果允许null值，设置require属性为false。Spring自带
     * @Qualifier：在自动按照类型注入的基础上，再按照bean的id注入；在给字段注入时不能独立使用，必须结合@Autowired一起使用；但是给方法参数注入时，可以独立使用。
     * @Resource：默认按照名称注入，如果找不到且没有指定name属性，这时才会根据类型注入，一旦name属性指定了，只会根据名称注入！Jdk自带
     * @Inject：默认按照类型自动装配，如果需要根据名称装配需要配合@Named使用。JSR330中的规范，需要额外导包。
     * @Value：给基本类型、string类型注入值，可以使用占位符获取属性文件中的值。
     */
    @Autowired
    private TeacherDao teacherDao;

    @PostConstruct //相当于init-method
    public void init() {
        System.out.println("TeacherService初始化方法");
    }

    @PreDestroy //相当于destroy-method
    public void destroy() {
        System.out.println("TeacherService销毁方法");
    }


    @Override
    public void save(Teacher teacher) {
        if (Objects.isNull(teacher)) {
            throw new NullPointerException();
        }
        System.out.println("保存老师成功");
    }

}
